package com.uade.services;

import java.io.IOException;
import java.io.StringReader;
import java.net.MalformedURLException;


import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.apache.log4j.Logger;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import com.uade.model.Configuracion;
import com.uade.model.Modelo;
import com.uade.model.Respuesta;
import com.uade.model.exceptions.LogisticaMonitoreoException;
import com.uade.xml.RespuestaHandler;

public class LogWSImpl extends LogSenderStrategy {

	private Logger log = Logger.getLogger(LogWSImpl.class);

	public LogWSImpl() {
		super();
		// TODO Auto-generated constructor stub
	}

	public LogWSImpl(Configuracion conf) {
		this.configuracion = conf;
	}

	@Override
	public void enviarLog(String xml) throws LogisticaMonitoreoException {

		log.debug("***********************");
		log.debug("Create Web Service Client...");

		LogisticaMonitoreoBeanService service1;
		try {
			service1 = new LogisticaMonitoreoBeanService(configuracion.getUrl());

			log.debug("Create Web Service...");
			LogisticaMonitoreoWS port1 = service1.getLogisticaMonitoreoWSPort();
			log.debug("Call Web Service Operation...");

			String respuesta = port1.informarVenta(xml);

			Respuesta resultado = procesarRespuesta(respuesta);

			if (!resultado.getEstado().equals(Modelo.OK.toString())) {
				log.error("No se pudo finalizar el proceso de compra: "
						+ resultado.getEstado() + " " + resultado.getMensaje());
				throw new LogisticaMonitoreoException(
						"No se pudo finalizar el proceso de compra: "
								+ resultado.getEstado() + " "
								+ resultado.getMensaje());
			}

			log.info("Server said: " + resultado.getMensaje());
			log.debug("***********************");
			log.debug("Call Over!");
		} catch (MalformedURLException e) {
			log.error("La url de la configuracion no posee un formato valido: "
					+ configuracion.getIp());
		}
	}

	private Respuesta procesarRespuesta(String respuesta)
			throws LogisticaMonitoreoException {
		RespuestaHandler handler = new RespuestaHandler();

		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser saxParser;
		try {
			saxParser = factory.newSAXParser();

			InputSource is = new InputSource();
			is.setCharacterStream(new StringReader(respuesta));
			saxParser.parse(is, handler);

		} catch (ParserConfigurationException e) {
			log.error("Error al parsear el archivo de respuesta"
					+ e.getMessage());
			throw new LogisticaMonitoreoException(
					"Excepcion al parsear la repsuesta");
		} catch (SAXException e) {
			log.error("Error al parsear el archivo de respuesta"
					+ e.getMessage());
			throw new LogisticaMonitoreoException(
					"Excepcion al parsear la repsuesta");
		} catch (IOException e) {
			log.error("Error al parsear el archivo de respuesta:"
					+ e.getMessage());
			throw new LogisticaMonitoreoException(
					"Excepcion al parsear la repsuesta");
		}
		return handler.getRespuesta();
	}

}
